package br.com.jk.cont.caixa;

import br.com.jk.cont.planocontas.PlanoContas;
import br.com.jk.empresa.Empresa;
import br.com.jk.financeiro.contaBanco.ContaBanco;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.annotations.ForeignKey;
import org.hibernate.annotations.Index;

/**
 * @author camilo
 */
@Entity
@Table(name = CaixaDao.NAME_TABLE, schema = CaixaDao.NAME_SCHEMA)
public class Caixa implements Serializable {

  public static final String ATTRIBUTE_ID = "id";
  public static final String ATTRIBUTE_ID_IMP = "idImp";
  public static final String ATTRIBUTE_DOC = "doc";
  public static final String ATTRIBUTE_DATA = "data";
  public static final String ATTRIBUTE_PLANO_CONTAS = "planoContas";
  public static final String ATTRIBUTE_CONTA_BANCO = "contaBanco";
  public static final String ATTRIBUTE_VALOR = "valor";
  public static final String ATTRIBUTE_OBSERVACAO = "observacao";
  public static final String ATTRIBUTE_EMPRESA = "empresa";
  private static final long serialVersionUID = 1L;
  @Id
  @SequenceGenerator(name = CaixaDao.NAME_SEQUENCE, sequenceName = CaixaDao.NAME_SEQUENCE)
  @GeneratedValue(strategy = GenerationType.AUTO, generator = CaixaDao.NAME_SEQUENCE)
//  @Index(name = CaixaDao.NAME_INDEX_ID, columnNames = CaixaDao.NAME_COLUMN_ID)
  @Index(name = CaixaDao.NAME_INDEX_CAIXA, columnNames = {CaixaDao.NAME_COLUMN_ID,
    CaixaDao.NAME_COLUMN_ID_EMPRESA, CaixaDao.NAME_COLUMN_ID_PLANO_CONTAS, CaixaDao.NAME_COLUMN_ID_CONTA_BANCO})
  private Integer id;
  @Column(name = CaixaDao.NAME_COLUMN_ID_IMP)
  private Integer idImp;
  @Column(name = CaixaDao.NAME_COLUMN_DOC)
  private String doc;
  @Temporal(TemporalType.DATE)
  @Column(name = CaixaDao.NAME_COLUMN_DATA)
  private Date data;
  @Column(name = CaixaDao.NAME_COLUMN_VALOR)
  private BigDecimal valor;
  @Column(name = CaixaDao.NAME_COLUMN_OBSERVACAO)
  private String observacao;
  @ManyToOne
  @JoinColumn(name = CaixaDao.NAME_COLUMN_ID_PLANO_CONTAS)
  @ForeignKey(name = CaixaDao.NAME_FK_PLANO_CONTAS)
  private PlanoContas planoContas;
  @ManyToOne
  @JoinColumn(name = CaixaDao.NAME_COLUMN_ID_CONTA_BANCO)
  @ForeignKey(name = CaixaDao.NAME_FK_CONTA_BANCO)
  private ContaBanco contaBanco;
  @ManyToOne
  @JoinColumn(name = CaixaDao.NAME_COLUMN_ID_EMPRESA)
  @ForeignKey(name = CaixaDao.NAME_FK_EMPRESA)
  private Empresa empresa;

  public Empresa getEmpresa() {
    return empresa;
  }

  public void setEmpresa(Empresa empresa) {
    this.empresa = empresa;
  }

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public Integer getIdImp() {
    return idImp;
  }

  public void setIdImp(Integer idImp) {
    this.idImp = idImp;
  }

  public String getDoc() {
    return doc;
  }

  public void setDoc(String doc) {
    this.doc = doc;
  }

  public Date getData() {
    return data;
  }

  public void setData(Date data) {
    this.data = data;
  }

  public BigDecimal getValor() {
    return valor;
  }

  public void setValor(BigDecimal valor) {
    this.valor = valor;
  }

  public String getObservacao() {
    return observacao;
  }

  public void setObservacao(String observacao) {
    this.observacao = observacao;
  }

  public PlanoContas getPlanoContas() {
    return planoContas;
  }

  public void setPlanoContas(PlanoContas planoContas) {
    this.planoContas = planoContas;
  }

  public ContaBanco getContaBanco() {
    return contaBanco;
  }

  public void setContaBanco(ContaBanco contaBanco) {
    this.contaBanco = contaBanco;
  }

  @Override
  public int hashCode() {
    int hash = 3;
    hash = 67 * hash + Objects.hashCode(this.id);
    hash = 67 * hash + Objects.hashCode(this.idImp);
    hash = 67 * hash + Objects.hashCode(this.doc);
    hash = 67 * hash + Objects.hashCode(this.data);
    hash = 67 * hash + Objects.hashCode(this.valor);
    hash = 67 * hash + Objects.hashCode(this.observacao);
    hash = 67 * hash + Objects.hashCode(this.planoContas);
    hash = 67 * hash + Objects.hashCode(this.contaBanco);
    hash = 67 * hash + Objects.hashCode(this.empresa);
    return hash;
  }

  @Override
  public boolean equals(Object obj) {
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    final Caixa other = (Caixa) obj;
    if (!Objects.equals(this.id, other.id)) {
      return false;
    }
    if (!Objects.equals(this.idImp, other.idImp)) {
      return false;
    }
    if (!Objects.equals(this.doc, other.doc)) {
      return false;
    }
    if (!Objects.equals(this.data, other.data)) {
      return false;
    }
    if (!Objects.equals(this.valor, other.valor)) {
      return false;
    }
    if (!Objects.equals(this.observacao, other.observacao)) {
      return false;
    }
    if (!Objects.equals(this.planoContas, other.planoContas)) {
      return false;
    }
    if (!Objects.equals(this.contaBanco, other.contaBanco)) {
      return false;
    }
    return Objects.equals(this.empresa, other.empresa);
  }

}
